/**
 * Promise.race(iterable) 方法返回一个 promise
 * 1) 一旦迭代器中的某个promise解决或拒绝，返回的 promise就会解决或拒绝(赛跑机制)
 * 2) 实现原理： then 注册的回调方法是数组中的某一个 Promise 的状态变为 fulfilled 的时候就执行. 因为 Promise 的状态只能改变一次, 那么我们只需要把 Promise.race 中产生的 Promise 对象的 resolve 方法, 注入到数组中的每一个 Promise 实例中的回调函数中即可
 */
// const Promise = require('./myPromise');

Promise.race = function (args) {
  return new Promise((resolve, reject) => {
    // 0.如果没传参，抛异常
    if (!Array.isArray(args)) {
      throw new TypeError(`${args} is not iterable (cannot read property Symbol...)`);
    }
    for (let i = 0, len = args.length; i < len; i++) {
      args[i].then(resolve, reject)
    }
  })
}

let p1 = new Promise(resolve => { })
// 3s后 resolve
let p2 = new Promise(resolve => {
  setTimeout(() => {
    resolve(3)
  }, 3000)
})
// 4s后 reject
let p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(2)
  }, 4000)
})

// 测试案例一：正常输出
Promise.race([p1, p2, p3]).then(res => {
  console.log('案例一：跑完的结果是' + res)
}, err => {
  console.log('案例一：跑完的结果是 err：' + err)
})

// 测试案例二：传入空数组，因为没有人参加赛跑，所以需要返回一个 pending 状态的 Promise
Promise.race([]).then(res => {
  console.log(res)
}, err => {
  console.log('err：' + err)
})
console.log(Promise.race([]))

// 测试案例三: 不传数组
Promise.race(5).then(res => {
  console.log(res)
}, err => {
  console.log('err：' + err)
})
